package com.gem.day09;

/**
 * 本类用来演示java.lang.Object类
 * Object类是所有Java类的顶级父类,所有Java类都直接或者间接继承于它
 * 注意:extends Object一般都是省略
 * 
 * @author easonsy
 * 2020年7月28日 上午8:59:16
 */
public class ObjectDemo {
	public static void main(String[] args) throws ClassNotFoundException {
		ObjectDemo oo = new ObjectDemo();

		//1.toString()方法
		/*
		 * 打印对象时,会自动调用对象的toString()方法;
		 * 如果该对象没有提供toString()方法,则调用的就是Object类中的toString(),
		 * 输出内容为: getClass().getName() + "@" + Integer.toHexString(hashCode());
		 * 如果该对象中重写了toString()方法,则输出以重写方法为准
		 */
		System.out.println(oo.toString());

		System.out.println("-------------------------------------");

		//2.getClass()方法
		/*
		 * getClass();用来获取某个对象所对应的类本身,
		 * 返回类型是Class类型,而这个Class类型可以用来描述整个类别,
		 * 从这个Class类型中可以获取这个类几乎所有的信息(属性,方法,构造,所在包,实现的接口,继承的父类...)
		 * ==>Java反射机制
		 */
		//a.Object类中的getClass()方法
		Class<?> c1 = oo.getClass();
		System.out.println(c1.getPackageName());

		/*
		 * 补充:Java获取Class实例的五种方式
		 */
		//b.Class类中静态方法,forName("类的全限定名")
		Class<?> c2 = Class.forName("com.gem.day09.ObjectDemo");

		//c.类名.class属性
		Class<?> c3 = ObjectDemo.class;

		//d.基本类型.class
		Class<?> c4 = int.class;

		//e.包装类型.type
		Class<?> c5 = Integer.TYPE;

		//注意:一个类可以创建多个对象,但是一个类的Class实例有且只有一个
		System.out.println(c1 == c3);
		System.out.println(c4 == c5);
	}

	@Override
	public String toString() {
		return "ObjectDemo";
	}
}
